package cn.hp.cms.servlet.user;

import cn.hp.cms.entity.User;
import cn.hp.cms.service.UserService;
import cn.hp.cms.service.impl.UserServiceImpl;
import cn.hp.cms.utils.JsonForServlet;
import cn.hp.cms.utils.PageData;
import cn.hp.cms.utils.ResultData;
import cn.hutool.core.util.StrUtil;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

// 用来处理所有的user下的请求
@WebServlet("/user/user.do")
@MultipartConfig  // 标识当前类可以接收 文件类型的参数内容
public class UserServlet extends HttpServlet {
// 依赖的service层
    UserService userService = new UserServiceImpl() ;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        使用Java的反射
//        反射:   Class 类 用来描述Java中类的特点 (类名 属性 包名 方法 父类 ...)
//        this 表示当前执行的对象
        String service = req.getParameter("service");
        System.out.println("service" + service);
        try {
            UserServlet.class.getDeclaredMethod(service, HttpServletRequest.class, HttpServletResponse.class).invoke(this,req,resp);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
//        switch (service){
//            case "delete":
//                delete(req,resp);
//                break;
//            case "reset":
//                reset(req,resp);
//                break;
//        }

    }
//      获取用户头像
    protected void userImg(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        获取当前登录的用户
        String userName = (String) request.getSession().getAttribute("user");
        ResultData resultData = userService.selectUserImg(userName);
        JsonForServlet.writeData(response,resultData);
    }

//    将图片保存在项目路径下
    protected void updateImg(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part part = request.getPart("userImg");  // 获取上传文件
        String user = (String) request.getSession().getAttribute("user");  // 得到当前登录的用户
        String userImg = request.getServletContext().getRealPath("userImg"); //  通过应用域，获取应用下的userImg文件的路径  项目路径/userImg
//        System.out.println(userImg);
        File file = new File(userImg);  // 对于保存用户头像的文件进行创建
        if (!file.exists() || !file.isDirectory()){
            file.mkdirs();
        }
        String submittedFileName = part.getSubmittedFileName();  // 获取上传文件名
        String suffix = submittedFileName.substring(submittedFileName.lastIndexOf(".")); // 获取上传的文件后缀
//        String imgPath = file.getAbsolutePath() + File.separator + part.getSubmittedFileName();
        String imgPath = file.getAbsolutePath() + File.separator + user + suffix;  // 拼接当前文件写入的地址，
        part.write(imgPath);
//      将图片地址保存在数据库中，与当前用户绑定
        ResultData resultData = userService.updateImg(user,"/userImg/"+user+suffix); // 使用 /userImg/文件名 进行保存  （ /  == localhost:8080/xx ）
        JsonForServlet.writeData(response,resultData);
    }

//    修改用户头像的, 将图片保存在服务器内存中； 浏览器可能会拦截
    protected void updateImg1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        获取用户上传的图片，将图片保存在服务器上，再将图片路径地址与当前登录用户进行绑定
//        String userImg = request.getParameter("userImg");
        Part part = request.getPart("userImg"); // 默认情况是不能接收图片 ，需要配置可以接收文件的注解
//        System.out.println(part.getSubmittedFileName());   xxx.jpg  xxx.png
//        为了避免用户无线上传头像，导致服务压力过大，使用用户名作为头像名称
        String user = (String) request.getSession().getAttribute("user");  // 11 zs
//      将图片保存在服务器的本地中，或者是单独使用一个保存图片的服务器 七牛云
        File file = new File("D:/userImg");
//        如果路径不存在，需要创建路径
        if (!file.exists() || !file.isDirectory()){
            file.mkdirs();
        }

//        新的文件地址 , 使用用户名作为图片名称
        String submittedFileName = part.getSubmittedFileName(); // 原图片名称 xxx.jpg
//        截取图片的后缀名  获取最后一个 .的index下标
        String suffix = submittedFileName.substring(submittedFileName.lastIndexOf("."));
//        String imgPath = file.getAbsolutePath() + File.separator + part.getSubmittedFileName();
        String imgPath = file.getAbsolutePath() + File.separator + user + suffix;
        part.write(imgPath);
//      将图片地址保存在数据库中，与当前用户绑定
        ResultData resultData = userService.updateImg(user,imgPath);
        JsonForServlet.writeData(response,resultData);
    }


//      修改密码
    protected void updatePwd(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        从页面中获取修改密码参数
        String password = request.getParameter("password");
        String newPassword = request.getParameter("newPassword");
        String username = (String) request.getSession().getAttribute("user");
//        调用业务层方法，修改密码
        ResultData resultData = userService.updatePassword(username,password,newPassword);
//        将结果返回给前端
        JsonForServlet.writeData(response,resultData);
    }

//      退出登录
    protected void loginOut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//            销毁当前session中的数据
        request.getSession().removeAttribute("user");
        JsonForServlet.writeData(response, ResultData.success("退出成功"));
    }

//    获取分页数据
    public void list(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
//      获取user表中的全部数据
//        List<User> users = userService.getAllUsers();
//        JsonForServlet.writeData(res, ResultData.successData("",users));
//        res.getWriter().println();
//        res.getWriter().println(JSON.toJSONString(users));

//        获取分页的数据  ，创建分页工具类
//        分页之后 页面传递来的数据包含 page 本页  limit每页数量
        int page = Integer.parseInt(req.getParameter("page"));
        int limit = Integer.parseInt(req.getParameter("limit"));
//        获取条件查询的参数
        String userName = req.getParameter("userName");  // null "" xxx
        String realName = req.getParameter("realName"); // null "" xxx
        int type = 0 ;
        if (!StrUtil.isEmpty(req.getParameter("type"))){
            type = Integer.parseInt(req.getParameter("type"));  // null "" xxx
        }

//      创建一个user用来保存查询条件
        User user = new User();
        user.setUserName(userName);
        user.setRealName(realName);
        user.setType(type);

//        创建pageData保存分页的数据
        PageData pageData = new PageData() ;
        pageData.setPage(page);
        pageData.setLimit(limit);

        pageData =  userService.getPageData(pageData,user);
        System.out.println(pageData.getData());
        JsonForServlet.writeData(res, ResultData.successData("",pageData));
    }

//      新增用户
    protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        获取前端传递的参数
        String userName = req.getParameter("userName");
        String realName = req.getParameter("realName");
        String password = req.getParameter("password");
        int type = Integer.parseInt(req.getParameter("type"));

        User user = new User();
        user.setUserName(userName);
        user.setRealName(realName);
        user.setPassword(password);
        user.setType(type);
        System.out.println(user);

//        调用新增用户方法
        ResultData resultData = userService.addUser(user);
        JsonForServlet.writeData(resp,resultData);
    }

//    删除用户方法
    protected void delete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        获取页面中传递的ids参数
        String parameter = request.getParameter("ids");
        String[] ids = parameter.split("&");
//        System.out.println(Arrays.toString(ids) + " ,, " +  ids.length);
        ResultData resultData = userService.delteUser(ids);
        JsonForServlet.writeData(response,resultData);
    }

//     重置密码方法
    protected void reset(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//                获取页面返回的参数
        int id = Integer.parseInt(request.getParameter("id"));
        ResultData resultData = userService.resetPassword(id);
//      将数据返回给页面
        JsonForServlet.writeData(response,resultData);
    }
}
